package Sources;


import java.util.*;

import Informations.*;
import Destinations.*;
import Transmetteurs.*;
import Sources.*;
import Sondes.*;
import Recepteurs.*;



/**
 * Classe SourceAleatoireBoolean heritant d'un composant source
 * d'informations dont l'information generee est de type Boolean.
 * SourceAleatoireBoolean emet des elements Boolean de maniere aleatoire.
 * @author THIAM, 
 * @author NANOUS
 * @author GUEYE
 * @author NDIAYE
 */
public class SourceAleatoireBoolean extends Source <Boolean> {

	/**
	 * Le nombre de bits a transmettre aux destinataires connectes
	 */
	//private int nbreBitAEnvoye;
	
	/**
	 * Utiliser pour generer des booleans aleatoirement
	 */
	private Random r;

	/**
	 * Constructeur
	 * @param nbreBitAEnvoye Le nombre de bits a generer
	 */
	/*public SourceAleatoireBoolean (int nbreBitAEnvoye) {
		super();
		this.nbreBitAEnvoye = nbreBitAEnvoye;
		this.r = new Random();
	}*/
	
	/**
	 * Constructeur gerant la taille du generateur aleatoire.
	 * Deux objets instancies avec une taille et un nombre de bits identiques genereront la meme sequence.
	 * Cela permet de tester la chaine de transmission plusieurs fois avec la meme sequence.
	 * @param taille taille du generateur aleatoire 
	 * @param nbreBitAEnvoye Le nombre de bits a generer
	 */
	/*public SourceAleatoireBoolean (long taille, int nbreBitAEnvoye) {
		super();
		this.nbreBitAEnvoye = nbreBitAEnvoye;
		this.r = new Random(taille);
	}*/
	
	
	public SourceAleatoireBoolean (int s) {
		Boolean [] infoEmise = new Boolean [s];
		Random rnd = new Random();
		for (int i=0; i<s; i++){
				infoEmise[i]= rnd.nextBoolean();	
		}
		
		informationGeneree = new Information <Boolean> (infoEmise);
		informationEmise = informationGeneree;
		

	}
		
	public SourceAleatoireBoolean (String s) {
		char current[]= s.toCharArray();
		Boolean [] infoEmise = new Boolean [current.length];	
		
		for (int i=0; i<current.length; i++ )
		{
			if (current[i]=='0')
		
				infoEmise[i]= false;
			else
				infoEmise[i]= true;
		}
		
		
		informationGeneree = new Information <Boolean> (infoEmise);
		informationEmise = informationGeneree;
	}


	/** 
	 * Pour emettre une information vers le destinataire
	 * @throws InformationNonConforme Si l'information n'est pas conforme 
	 */
	/*public void emettre () throws InformationNonConforme {
		Boolean[] tabBoolean = new Boolean[this.nbreBitAEnvoye];
		// generation des informations
		for (int i = 0 ; i < nbreBitAEnvoye ; i++) {
			tabBoolean[i] = r.nextBoolean();
		}
		informationGeneree = new Information<Boolean>(tabBoolean);

		// parcourir toutes les sondes connectees
		for (DestinationInterface <Boolean> d : destinationsConnectees ) {
			//emission des donnees aux recepteurs
			d.recevoir(informationGeneree);
		}

		informationEmise = informationGeneree;
	}*/
	
	public void emettre() throws InformationNonConforme{
		for (DestinationInterface <Boolean> destination : destinationsConnectees) {
			destination.recevoir(informationGeneree);	
		
			}
	}

}
